package com.lzh.java;

/**
 * @author liuzhihao
 * @create 2021-02-25 12:12
 */

import org.junit.Test;

import java.io.*;

/**
 *
 * 其他流的使用：
 * 1.标准的输入、输出流
 * 2.打印流
 * 3.数据流
 *
 */
public class OtherStreamTest {
    /**
     * 1.标准的输入、输出流
     *  1.1
     *  System.in:标准的输入流，默认从键盘输入
     *  System.out：标准的输出流，默认从控制台输出
     *  1.2
     *  System类的setIn(InputStream is)/ setOut(PrintStream ps)方式重写指定输入输出的流
     *
     *  1.3练习
     *  从键盘输入字符串，要求将读取到的整行字符串转成大写输出。然后继续
     * 进行输入操作，直至当输入“e”或者“exit”时，退出程序。
     *
     * 方法一：使用Scanner实现，调用next()返回一个字符串
     * 方法二：使用System.in。System.in  ---> 转换流--->BufferedReader的readLine()
     */

    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            br = new BufferedReader(isr);

            while(true){
                System.out.println("请输入字符串：");
                String data = br.readLine();
                if("e".equalsIgnoreCase(data) || "exit".equalsIgnoreCase(data)){
                    System.out.println("程序结束");
                    break;
                }
                String upperCase = data.toUpperCase();
                System.out.println(upperCase);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 2.打印流：PrintStream 和PrintWriter
     *
     * 2.1提供了一系列重载的print()和println()
     * 2.2练习：
     */
    @Test
    public void test1(){
        System.out.println("请输入信息(退出输入e或exit):");
// 把"标准"输入流(键盘输入)这个字节流包装成字符流,再包装成缓冲流
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = null;
        try {
            while ((s = br.readLine()) != null) { // 读取用户输入的一行数据 --> 阻塞程序
                if ("e".equalsIgnoreCase(s) || "exit".equalsIgnoreCase(s)) {
                    System.out.println("安全退出!!");
                    break;
                }
// 将读取到的整行字符串转成大写输出
                System.out.println("-->:" + s.toUpperCase());
                System.out.println("继续输入信息");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close(); // 关闭过滤流时,会自动关闭它包装的底层节点流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 3.1 DataInputStream和DataOutputStream
     * 3.2 作用：用于读取或写出基本数据类型的变量或字符串
     *
     */
    @Test
    public void test2(){

        DataOutputStream dos = null;
        try {
            dos = new DataOutputStream(new FileOutputStream("data.txt"));

            dos.writeUTF("刘智豪");
            dos.flush();//刷新操作，将内存内存中的数据写入文件
            dos.writeInt(23);
            dos.flush();
            dos.writeBoolean(true);
            dos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(dos != null){
                try {
                    dos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    /**
     * 将文件中存储的基本数据类型变量和字符串读取读取到内存中，保存在变量中
     *
     * 注意点：读取不同类型的数据的顺序要与当初写入文件时，保存的数据的顺序一致！
     */
    @Test
    public void test3(){

        DataInputStream dis = null;
        try {
            dis = new DataInputStream(new FileInputStream("data.txt"));

            String name = dis.readUTF();
            int age = dis.readInt();
            boolean isMale = dis.readBoolean();

            System.out.println("name :" +name);
            System.out.println("age :" +age);
            System.out.println("isMale :" +isMale);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(dis != null){
                try {
                    dis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

}
